package com.yourenbang.lingyun.transaction.mapper;

import com.yourenbang.lingyun.domain.FundAccount;
import com.yourenbang.lingyun.transaction.web.domain.vo.manage.ManageUserFundAccountVO;
import com.yourenbang.transaction.api.model.dto.fund.AccountTypeEarningVO;
import com.yourenbang.transaction.api.model.dto.fund.FundDetailDTO;
import com.yourenbang.transaction.api.model.dto.manage.QueryFundAccountDTO;
import com.yourenbang.transaction.api.model.vo.manage.QueryAccountTypeVO;
import com.yourenbang.transaction.api.model.vo.manage.QueryFundAccountDetailVO;
import com.yourenbang.transaction.api.model.vo.manage.QueryFundAccountVO;
import com.yourenbang.transaction.api.model.vo.manage.TopupRecordVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

public interface TransactionFundAccountMapper {

    /**
     * 获取系统账户信息
     *
     * @param accountType 资金账户类型
     */
    FundAccount getSysAccountByType(@Param("accountType") Integer accountType);

    /**
     * 获取资金接收人对应的资金支出账户信息
     *
     * @param accountType  资金账户类型
     * @param toUserBaseId 资金接收人userid
     */
    FundAccount getBossAccountByToUserInfo(@Param("accountType") Integer accountType, @Param("toUserBaseId") String toUserBaseId);

    /**
     * 获取资金接收人对应的资金支出账户信息（商户）
     *
     * @param accountType          资金账户类型
     * @param toMerchantUserBaseId 资金接收人userid(商户)
     */
    FundAccount getBossAccountByMerchantInfo(@Param("accountType") Integer accountType, @Param("toMerchantUserBaseId") String toMerchantUserBaseId);

    /**
     * 获取所有系统账户信息
     */
    List<FundAccount> getAllSysAccount(@Param("platNo") Short platNo);

    /**
     * 获取用户账户信息
     *
     * @param accountType 资金账户类型
     * @param userBaseId  用户id
     */
    FundAccount getUserAccountByType(@Param("userBaseId") String userBaseId, @Param("accountType") Integer accountType);

    FundAccount getFundAccountById(@Param("fundAccountId") Integer fundAccountId);

    /**
     * 用户账户加钱（账户总收入+;可提现金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     * @see #incomeAdd(Integer, BigDecimal)
     */
    @Deprecated
    int addUserAcc(@Param("userId") String userId, @Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 资金加帐（账户总收入+;可提现金额+）
     *
     * @param fundAccountId 资金账户类型
     * @param amt           金额
     */
    int incomeAdd(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);

    /**
     * 用户账户减钱（可提现金额-;已提现金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     * @see #withdrawableSubtract(Integer, BigDecimal)
     */
    @Deprecated
    int subtractUserAcc(@Param("userId") String userId, @Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 资金减帐（可提现金额-;已提现金额+）
     *
     * @param fundAccountId 资金账户ID
     * @param amt           金额
     */
    int withdrawableSubtract(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);

    /**
     * 资金冲正扣款（可提现金额-;收益金额-）
     *
     * @param fundAccountId 资金账户ID
     * @param amt           金额
     */
    int reversal(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);

    /**
     * 资金冲正加帐（可提现金额+）
     *
     * @param fundAccountId 资金账户类型
     * @param amt           金额
     */
    int reversalAdd(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);

    /**
     * 用户账户减钱（可提现金额-;已提现金额+）（不检验用户钱够不够）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int subtractUserAccNoCheck(@Param("userId") String userId, @Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 用户账户冻结（可提现金额-;冻结中的金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    @Deprecated
    int freeUserAcc(@Param("userId") String userId, @Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 资金冻结 （可提现金额-;冻结金额+）
     *
     * @param fundAccountId
     * @param amt
     * @return
     */
    int withdrawableDeposit(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);

    /**
     * 用户账户解冻（可提现金额+;冻结中的金额-）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    @Deprecated
    int unFreeUserAcc(@Param("userId") String userId, @Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);


    /**
     * 冻结撤销（可提现金额+;冻结中的金额-）
     *
     * @param fundAccountId 资金账户类型
     * @param amt           金额
     */
    int frozenCancel(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);


    /**
     * 用户冻结账户减钱（冻结中的金额-;已提现金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int subtractUnFreeUserAcc(@Param("userId") String userId, @Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 冻结解冻（冻结中的金额-;已提现金额+）
     *
     * @param fundAccountId 资金账户类型
     * @param amt           金额
     */
    int frozenUndeposit(@Param("fundAccountId") Integer fundAccountId, @Param("amt") BigDecimal amt);

    /**
     * 系统账户加钱（账户总收入+;可提现金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int addSysAcc(@Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 系统账户减钱（可提现金额-;已提现金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int subtractSysAcc(@Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 系统账户减钱（可提现金额-;已提现金额+）（不检验用户钱够不够）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int subtractSysAccNoCheck(@Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 系统账户冻结（可提现金额-;冻结中的金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int freeSysAcc(@Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 系统账户解冻（可提现金额+;冻结中的金额-）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int unFreeSysAcc(@Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 系统冻结账户减钱（冻结中的金额-;已提现金额+）
     *
     * @param accountType 资金账户类型
     * @param amt         金额
     */
    int subtractUnFreeSysAcc(@Param("accountType") Integer accountType, @Param("amt") BigDecimal amt);

    /**
     * 复合查询资金账户
     *
     * @param dto
     * @return
     */
    List<QueryFundAccountVO> queryFundAccount(QueryFundAccountDTO dto);

    /**
     * 查询资金账户类型
     *
     * @return
     */
    List<QueryAccountTypeVO> queryFundAccountType(@Param("platNo") Short platNo);


    /**
     * 查询账户详情
     *
     * @param fundAccountId
     * @return
     */
    QueryFundAccountDetailVO selectFundAccountDetail(@Param("fundAccountId") Integer fundAccountId);

    /**
     * 查询账户充值记录
     *
     * @param fundDetailDTO
     * @return
     */
    List<TopupRecordVO> selectTopupRecord(@Param("fundDetailDTO") FundDetailDTO fundDetailDTO, @Param("platNo") Short platNo);

    /**
     * 查询系统账户
     *
     * @param fundAccountId
     * @return
     */
    FundAccount selectSysFundAccountById(@Param("fundAccountId") Integer fundAccountId);

    /**
     * 查询用户账户
     *
     * @param userBaseId      用户ID
     * @param accountTypeList 账户类型列表
     * @return
     */
    List<ManageUserFundAccountVO> selectUserFundAccountList(@Param("userBaseId") String userBaseId,
                                                            @Param("accountTypeList") List<String> accountTypeList,
                                                            @Param("a9UserBaseId") String a9UserBaseId);

    /**
     * 查询用户的各种收入
     *
     * @return
     */
    List<AccountTypeEarningVO> findFundAccountByType(@Param("accountTypes") List<String> accountTypes,
                                                     @Param("userBaseId") String userBaseId);

    /**
     * 按月查询用户的各种收入
     */
    List<AccountTypeEarningVO> findMonthFundAccountByType(
            @Param("accountTypes") List<String> accountTypes,
            @Param("userBaseId") String userBaseId,
            @Param("month") String month);

    /**
     * 查询用户某账户类型的充值收入
     */
    BigDecimal findRechargeByType(
            @Param("userBaseId") String userBaseId,
            @Param("accountType") String accountType
    );

}